package com.java;

/**
 * 释放锁的行为会破环多线程安全性
 */
public class WaitNotify {
    static class ThreadSon extends Thread {
        // static修饰是因为票的数量应该被所有窗口共享
        static int ticket = 0;
        
        // synchronized的锁对象相当于钥匙
        static Object key = new Object();
        
        @Override
        public void run() {
            while (true) {
                synchronized (key) {
                    if (ticket > 9) {
                        break;
                    }
                    
                    try {
                        key.wait(10); // ⭐⭐⭐
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    
                    ticket++;
                    System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket + "张票");
                }
            }
        }
    }
    
    public static void main(String[] args) throws InterruptedException {
        new ThreadSon().start();
        new ThreadSon().start();
        new ThreadSon().start();
    }
    
    /**
     * 输出结果如下，每次运行的结果不同！释放锁的行为会破环多线程安全性出现重复卖或卖超的问题
     * Thread-0正在卖第1张票
     * Thread-2正在卖第2张票
     * Thread-1正在卖第3张票
     * Thread-0正在卖第4张票
     * Thread-1正在卖第5张票
     * Thread-2正在卖第6张票
     * Thread-2正在卖第7张票
     * Thread-0正在卖第8张票
     * Thread-1正在卖第9张票
     * Thread-1正在卖第10张票
     * Thread-2正在卖第11张票
     * Thread-0正在卖第12张票
     */
}
